<test>
    <substitutions>
        <substitution>
            <name>dictionary_layout</name>
            <values>
                <value>hashed</value>
                <value>hashed_array</value>
            </values>
        </substitution>

        <substitution>
            <name>dictionary_shards</name>
            <values>
                <value>1</value>
                <value>16</value>
            </values>
        </substitution>

        <substitution>
            <name>func</name>
            <values>
                <value>dictGetHierarchy</value>
                <value>dictGetDescendants</value>
            </values>
        </substitution>
    </substitutions>

    <create_query>
        CREATE TABLE hierarchical_dictionary_source_table
        (
            id UInt64,
            parent_id UInt64
        ) ENGINE = MergeTree ORDER BY id;
    </create_query>

    <create_query>
        CREATE DICTIONARY hierarchical_{dictionary_layout}_shards{dictionary_shards}_dictionary
        (
            id UInt64,
            parent_id UInt64 HIERARCHICAL
        )
        PRIMARY KEY id
        SOURCE(CLICKHOUSE(DB 'default' TABLE 'hierarchical_dictionary_source_table'))
        LAYOUT({dictionary_layout}(SHARDS {dictionary_shards}))
        LIFETIME(0);
    </create_query>

    <create_query>
        CREATE DICTIONARY hierarchical_flat_dictionary
        (
            id UInt64,
            parent_id UInt64 HIERARCHICAL
        )
        PRIMARY KEY id
        SOURCE(CLICKHOUSE(DB 'default' TABLE 'hierarchical_dictionary_source_table'))
        LAYOUT(FLAT(max_array_size 1000001))
        LIFETIME(0);
    </create_query>

    <fill_query>
        INSERT INTO hierarchical_dictionary_source_table
        WITH 5000 AS first_level_start, 50000 as second_level_start
        SELECT
            (number + 1) as id,
            multiIf(id > second_level_start, id % (second_level_start - first_level_start) + first_level_start + 1,
                    id > first_level_start, (id % first_level_start) + 1,
                    0) as parent_id
        FROM system.numbers
        LIMIT 1000000;
    </fill_query>

    <query>
        SELECT {func}('hierarchical_flat_dictionary', number + 1) FROM numbers(1000000) FORMAT Null;
    </query>
    <query>
        SELECT {func}('hierarchical_{dictionary_layout}_shards{dictionary_shards}_dictionary', number + 1) FROM numbers(1000000) FORMAT Null;
    </query>

    <drop_query>DROP DICTIONARY IF EXISTS hierarchical_{dictionary_layout}_shards{dictionary_shards}_dictionary;</drop_query>
    <drop_query>DROP DICTIONARY IF EXISTS hierarchical_flat_dictionary;</drop_query>
    <drop_query>DROP TABLE IF EXISTS hierarchical_dictionary_source_table;</drop_query>
</test>
